#include <stdio.h>
#include <unistd.h>
#include "cmsis_os2.h"
#include "iot_gpio.h"
#include "iot_gpio_ex.h"
#include "ohos_init.h"

#define BUTTON_GPIO 5       // 按键GPIO引脚
#define LED_GPIO    8       // LED GPIO引脚

static volatile uint8_t led_state = 0;  // LED状态(0:灭, 1:亮)
static osSemaphoreId_t button_sem = NULL;  // 按键信号量

// GPIO中断回调函数
static void GpioIsrFunc(char *arg)
{
    (void)arg;
    osSemaphoreRelease(button_sem);  // 释放信号量
}

// 初始化GPIO
static void InitGpio(void)
{
    // 初始化按键GPIO(设置为输入+上拉+中断下降沿触发)
    IoTGpioInit(BUTTON_GPIO);
    IoTGpioSetFunc(BUTTON_GPIO, IOT_GPIO_FUNC_GPIO_5_GPIO);
    IoTGpioSetDir(BUTTON_GPIO, IOT_GPIO_DIR_IN);
    IoTGpioSetPull(BUTTON_GPIO, IOT_GPIO_PULL_UP);
    IoTGpioRegisterIsrFunc(BUTTON_GPIO, IOT_INT_TYPE_EDGE, IOT_GPIO_EDGE_FALL_LEVEL_LOW, GpioIsrFunc, NULL);

    // 初始化LED GPIO(设置为输出+默认低电平)
    IoTGpioInit(LED_GPIO);
    IoTGpioSetFunc(LED_GPIO, IOT_GPIO_FUNC_GPIO_8_GPIO);
    IoTGpioSetDir(LED_GPIO, IOT_GPIO_DIR_OUT);
    IoTGpioSetOutputVal(LED_GPIO, IOT_GPIO_VALUE0);
}

// 按键任务
static void ButtonTask(void)
{
    InitGpio();
    
    // 创建信号量
    osSemaphoreAttr_t sem_attr = {0};
    sem_attr.name = "button_sem";
    button_sem = osSemaphoreNew(1, 0, &sem_attr);
    
    while (1) {
        // 等待按键中断信号
        if (osSemaphoreAcquire(button_sem, osWaitForever) == osOK) {
            led_state = !led_state;  // 切换LED状态
            IoTGpioSetOutputVal(LED_GPIO, led_state ? IOT_GPIO_VALUE1 : IOT_GPIO_VALUE0);
            printf("Button pressed, LED state: %s\n", led_state ? "ON" : "OFF");
            
            // 简单消抖(实际产品中可能需要更复杂的消抖逻辑)
            osDelay(100);
        }
    }
}

// 任务初始化
static void ButtonTaskInit(void)
{
    osThreadAttr_t attr = {
        .name = "ButtonTask",
        .attr_bits = 0U,
        .cb_mem = NULL,
        .cb_size = 0U,
        .stack_mem = NULL,
        .stack_size = 1024,
        .priority = 15
    };
    
    if (osThreadNew((osThreadFunc_t)ButtonTask, NULL, &attr) == NULL) {
        printf("Failed to create ButtonTask!\n");
    }
}

APP_FEATURE_INIT(ButtonTaskInit);